package com.lucfzy.jwt;

import com.auth0.jwt.interfaces.Claim;
import com.lucfzy.employee.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@RestController
@CrossOrigin
public class TokenTest {

    @Autowired
    private EmployeeMapper employeeMapper;

    private final Map<String, TokenModel> userTokenMap = new HashMap<>();

    @GetMapping("/query")
    public String queryResult() {
        return "query success";
    }

    @PostMapping("/login")
    public LoginResponse verifyTokenResult(@RequestBody UserInfo userInfo) {
        // 1. 校验用户名是否已经生成过token了。
        // 2. 如果已经生成过token，检查token是否已经过期。
        // 3. 如果过期则生成新的token。
        // 4. 如果未过期，则直接返回原token。
//        try {
//            if (userTokenMap.containsKey(userInfo.getUserName())) {
//                TokenModel tokenModel = userTokenMap.get(userInfo.getUserName());
//                Date expDate = tokenModel.getExpDate();
//                // 说明没有过期
//                if (expDate.after(new Date())) {
//                    LoginResponse loginResponse = new LoginResponse();
//                    loginResponse.setCode("200");
//                    loginResponse.setToken(userTokenMap.get(userInfo.getUserName()).getToken());
//                    return loginResponse;
//                }
//                // 否则说明token已经过期了。
//                return getLoginResponse(userInfo);
//            }
        // 校验用户名密码是否正确
        if (employeeMapper.findByUsernameAndPassword(userInfo) == 0) {
            throw new RuntimeException("用户名密码错误！");
        }
        // 如果用户名密码正确，生成token
        LoginResponse loginResponse;
        try {
            loginResponse = getLoginResponse(userInfo);
            return loginResponse;
        } catch (Exception e) {
            LoginResponse errorResponse = new LoginResponse();
            errorResponse.setCode("500");
            errorResponse.setToken(null);
            e.printStackTrace();
            return errorResponse;
        }
    }

    private LoginResponse getLoginResponse(UserInfo userInfo) throws Exception {
        String token = JWTUtil.createToken(userInfo.getUsername(), userInfo.getPassword());
        Map<String, Claim> stringClaimMap = JWTUtil.verifyToken(token);
        Date expDate = stringClaimMap.get("exp").asDate();
        TokenModel tokenModel = new TokenModel();
        tokenModel.setToken(token);
        tokenModel.setExpDate(expDate);
        userTokenMap.put(userInfo.getUsername(), tokenModel);
        System.out.println("token=" + token);
        LoginResponse response = new LoginResponse();
        response.setToken(token);
        response.setCode("200");
        return response;
    }
}
